/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SemanticoPacote;
import SemanticoPacote.TratamentoErroSemantico.ErroSemantico;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Larissa
 */
public class declaracaoStructs {

   // private Hashtable<Integer, String> Struct = new Hashtable<Integer, String>();

     public void declaraStructs(TabelaSimbolos tabelaSimbolos){

         //<declaracaoStructs> ::= [ typedef ] struct { {<declaracaoVariaveisStruct>} } <nome> ;

          if (tabelaSimbolos.getLookahead().equals("typedef")) {
              tabelaSimbolos.soConsome(); //consome o typedef
          }
          tabelaSimbolos.soConsome(); //consome o struct
          tabelaSimbolos.soConsome(); //consome a {

          boolean verifica = true;
          while(verifica == true){
               System.out.println("aki1::" + tabelaSimbolos.getLookahead());
              declaraVariaveisStruct(tabelaSimbolos);
              if(tabelaSimbolos.getLookahead().equals("}"))
                  verifica = false;
            }
           
          if(tabelaSimbolos.getLookahead().equals("}")){
                tabelaSimbolos.soConsome();//consome o }
          //  if(this.jaContemAquelaStruct(tabelaSimbolos.getLookahead())){
                if(!tabelaSimbolos.verificaGlobais(tabelaSimbolos.getLookahead())){
                    System.out.println("ERRO SEMANTICO - " + tabelaSimbolos.getLookahead() + " na linha " + tabelaSimbolos.getLinha() + " já foi declarada");
                    ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Variável " + tabelaSimbolos.getLookahead() +  " declarada mais de uma vez");
                }
           // }
                tabelaSimbolos.soConsome(); //consome o identificador
                tabelaSimbolos.soConsome(); //consome o ;
          }
     }


//exemplo:
//    typedef struct {
//	char CPF[12], Nome[30];
   //} Cliente;

//<declaracaoVariaveisStruct> ::= <tipos> <nome> { [ (<numero> | <nome>) ] } { , <nome> { [ (<numero> | <nome>) ] } ;
    private void declaraVariaveisStruct(TabelaSimbolos tabelaSimbolos) {

        tabelaSimbolos.soConsome();//consome o tipo

        while(!tabelaSimbolos.getLookahead().equals(";")){

            String escopoStructVar = tabelaSimbolos.superBuscaEscopo();
            System.out.println("escopoStructVar: " + escopoStructVar);
            if(!tabelaSimbolos.verificaSeJaFoiDeclaradoEscopo2(tabelaSimbolos.getLookahead(),escopoStructVar )){
                System.out.println("ERRO SEMANTICO - " + tabelaSimbolos.getLookahead() + " na linha " + tabelaSimbolos.getLinha() + " A variável já foi declarada");
                ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Variável declarada mais de uma vez");
            }

            tabelaSimbolos.soConsome();//consome o nome

            while(tabelaSimbolos.getLookahead().equals("[")){
                tabelaSimbolos.soConsome();//consome [

                System.out.println("tipo: " +tabelaSimbolos.getTipo());
                 String escopoStruct = tabelaSimbolos.superBuscaEscopo();
                 System.out.println("escopoStruct: " + escopoStruct);

                if(tabelaSimbolos.getTipo().equals("identificador")){
                    if(!tabelaSimbolos.verificaSeFoiDeclaradoComoGlobal(tabelaSimbolos.getLookahead())
                       && !tabelaSimbolos.verificaSeJaFoiDeclarado(tabelaSimbolos.getLookahead(), "struct") ){
                        System.out.println("ERRO SEMANTICO - " + tabelaSimbolos.getLookahead() + " na linha " + tabelaSimbolos.getLinha() + " A variável não foi declarada");
                        ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: A variável " + tabelaSimbolos.getLookahead()+ " não foi declarada");
                    }
                }

                tabelaSimbolos.soConsome();//consome o numero ou nome

                tabelaSimbolos.soConsome();//consome ]
            }

            if(tabelaSimbolos.getLookahead().equals(","))
                tabelaSimbolos.soConsome();//consome a ','

        }
        tabelaSimbolos.soConsome();//consome o ';'
    }
}
